﻿// 701 摸鱼.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>



using namespace std;


/*
http://oj.daimayuan.top/course/5/problem/252
蜗蜗一共有 n天假期，在假期的第 i天摸鱼他会得到 ai的快乐值。
如果蜗蜗每天都摸鱼的话，他会有愧疚感，所以蜗蜗制定了这么个计划：
对于每一天，蜗蜗都有一个列表，如果蜗蜗在列表中的每一天都在摸鱼的话，这一天蜗蜗就不能摸鱼。
现在请问蜗蜗如何摸鱼，使得他能获得的快乐值总和最大？请求出快乐值总和最大是多少。

输入格式
第一行一个整数 n表示天数。

第二行 n个整数 a1,a2,...,an。

接下来 n行，对于第 i行，先读入一个整数 li表示第 i天的列表上有几天。
如果 li=0，也就是列表是空的话，表示第 i天没有限制；
否则，再读入 li个数表示列表上列的分别是第几天，数据保证这 li个数两两不同并且都不等于 i。

输出格式
一行一个整数表示答案。

样例输入
4
1 2 3 4
0
1 1
1 2
2 2 3
样例输出
8
数据范围
对于 100%的数据，保证 2≤n≤20,1≤ai≤100000,0≤li<n。
*/

int n, a[21], l[21], s[21], b[21];

int main()
{
	scanf("%d",&n);
	for (int i = 1; i <= n; i++)
		scanf("%d",&a[i]);
	for (int i = 1; i <= n; i++) {
		scanf("%d", &l[i]);
		for (int j = 1; j <= l[i]; j++) {
			int x;
			scanf("%d",&x);
			s[i] |= (1 << (x - 1));
		}
	}

	int ans = 0;
	for (int i = 0; i < 1 << n; i++) {
		for (int j = 1, k = i; j <= n; j++, k /= 2) {
			b[j] = k & 1;
		}
		bool ok = true;
		for (int j = 1; j <= n && ok; j++) {
			if (b[j] && l[j] && (i & s[j]) == s[j]) {
				ok = false;
			}
		}

		if (!ok) continue;
		int res = 0;
		for (int j = 1; j <= n; j++) {
			if (b[j])
				res += a[j];
		}
		ans = max(ans, res);
	}

	printf("%d\n",ans);

	return 0;
}
 